/*******************************************************************************
 * Classe PnlJeu : Classe de création et de gestion du panneau contenant le jeu
 ******************************************************************************/
package prjintwg;

import ElementsDeJeu.*;
import Armes.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 *
 * @author W&G
 */
public class PnlJeu extends JPanel {

    private JPanel pnlConteneur = new JPanel();//Panneau conteneur
    private Fenetre f;//Fenetre du programme
    private Personnage perso1;//premier personnage
    private Personnage perso2;//deuxieme personnage
    private ProjectileSimple projectile;//projectile à envoyer
    private Laser laser;//laser a envoyer
    private Decor monDecor;//decor du jeu
    private Actions action = new Actions();//objet de gestion des actions
    private JButton btnDeplacement = new JButton("Fire !");//bouton d'action
    private JLabel lblAngle = new JLabel("Angle");//Etiquette de l'angle
    private JSlider sldAngle = new JSlider(0, 180);//Slider retournant la valeur de l'angle
    private JLabel lblVitesse = new JLabel("Vitesse");//Etiquette de la vitesse
    private JSlider sldVitesse = new JSlider(0, 90);//Slider retournant la valeur de la vitesse
    private Explosion explosion1;//premiere explosion
    private Explosion explosion2;//deuxieme explosion
    private Explosion explosion3;//troisieme explosion
    private Explosion explosion4;//quatrieme explosion
    private Explosion explosion5;//cinquieme explosion
    //Etiquette du vent
    private JLabel lblVent = new JLabel("Vent : " + Jeu.getVent());
    //Etiquette de la gravité
    private JLabel lblGravite = new JLabel("Gravite : " + Jeu.getGravite());
    //Etiquette du score du joueur 1
    private JLabel lblJoueur1 = new JLabel("Joueur 1 :  " + 0000);
    //Etiquette du score du joueur 2
    private JLabel lblJoueur2 = new JLabel("Joueur 2 :  " + 0000);
    //Tableau des noms des armes
    private String[] armes = {
        "Fireball", "N Jumper", "Bombe sonore", "Bombe fertile", "Boomerang", "Bombe Tornade", "Bombe Gravité", "Laser", "Téléportation ", "Cri de guerre"
    };
    //Liste déroulante des armes
    private JComboBox cboArmes = new JComboBox(armes);
    private int positionDepartX = 0;//position de depart de l'arme
    private int positionDepartY = 0;//position de depart de l'arme
    //Etiquette des points de vie du joueur 1
    private JLabel lblPvJoueur1 = new JLabel("PV : " + 1000);
    //Etiquette des points de vie du joueur 2
    private JLabel lblPvJoueur2 = new JLabel("PV : " + 1000);
    private Jeu jeu;//l'objet de jeu
    private Visee visee;//visee pour les armes
    private Visee viseeLaser;//visee pour le laser
    private BombeFertile bf;//la bombe fertile
    //Objet de gestion des slider
    private SliderListener sldL = new SliderListener();
    private int teleportations = 0;//Nombre de teleportation effectuées par tour
    private Explosion explosionSonore;//Explosion sonore
    private CriDeGuerre criDeGuerre;//le cri de guerre
    //bouton renvoyant au panneau précédent
    private JButton btnRetour = new JButton("Retour");
    //bouton renvoyant au panneau précédent
    private JButton btnAide = new JButton("?");
    private boolean dessinerArcEnCiel = false;//valeur booléenne de dessin de l'arc-en-ciel
    private boolean debutJeu = true;//valeur booléenne du début du jeu
    private int munitions = 0;//munition des joueurs
    private JLabel lblMunitions = new JLabel();//Etiquette des munitions
    private boolean barreVolume = false;//valeur booléenne de la barre de volume
    private int volume = 0;//volume retourné

    /**
     * Constructeur de la fenetre
     * @param f Fenetre du programme
     */
    public PnlJeu(Fenetre f) {
        this.f = f;
        this.setLayout(null);
        jeu = f.getJeu();

        monDecor = new Decor(f);
        perso1 = new Personnage(f, 1, 62, monDecor.getTerrainY(31) + 32);
        perso2 = new Personnage(f, 2, 997, monDecor.getTerrainY(498) + 32);

        explosion1 = new Explosion(-500, -500, 40, 40);
        explosion2 = new Explosion(-500, -500, 40, 40);
        explosion3 = new Explosion(-500, -500, 40, 40);
        explosion4 = new Explosion(-500, -500, 40, 40);
        explosion5 = new Explosion(-500, -500, 40, 40);
        explosionSonore = new ExplosionSonore(-500, -500, 40, 40);
        nouveauProjectile();
        visee = new Visee(this);
        visee.setPosition(projectile.getPositionX(), projectile.getPositionY(), Jeu.getTourTir());
        laser = new Laser(-500, -500, this);
        viseeLaser = new Visee(this);
        viseeLaser.setPosition(laser.getPositionX(), laser.getPositionY(), Jeu.getTourTir());
        this.add(pnlConteneur);
        pnlConteneur.setBackground(Color.BLACK);
        pnlConteneur.setLayout(null);
        pnlConteneur.add(perso1);
        pnlConteneur.add(perso2);
        pnlConteneur.add(visee);
        pnlConteneur.add(viseeLaser);
        pnlConteneur.add(projectile);
        pnlConteneur.add(laser);
        pnlConteneur.add(monDecor);
        lblJoueur1.setBounds(5, 5, 110, 20);
        this.add(lblJoueur1);
        criDeGuerre = new CriDeGuerre(this);
        lblJoueur1.setForeground(Color.red);
        btnDeplacement.setBounds(115, 5, 80, 20);
        this.add(btnDeplacement);
        btnDeplacement.setBackground(Color.BLACK);
        btnDeplacement.setForeground(Color.WHITE);
        lblAngle.setBounds(210, 5, 70, 20);
        this.add(lblAngle);
        lblAngle.setForeground(Color.WHITE);
        sldAngle.setBounds(250, 7, 175, 20);
        this.add(sldAngle);
        sldAngle.setBackground(Color.BLACK);
        lblVitesse.setBounds(430, 5, 70, 20);
        this.add(lblVitesse);
        lblVitesse.setForeground(Color.WHITE);
        sldVitesse.setBounds(480, 7, 175, 20);
        this.add(sldVitesse);
        sldVitesse.setBackground(Color.BLACK);
        lblVent.setBounds(660, 5, 70, 20);
        this.add(lblVent);
        lblVent.setForeground(Color.WHITE);
        lblGravite.setBounds(730, 5, 75, 20);
        this.add(lblGravite);
        lblGravite.setForeground(Color.WHITE);
        lblJoueur2.setBounds(960, 5, 110, 20);
        this.add(lblJoueur2);
        lblJoueur2.setForeground(Color.blue);
        cboArmes.setBounds(815, 5, 130, 20);
        this.add(cboArmes);
        cboArmes.setBackground(Color.BLACK);
        cboArmes.setForeground(Color.WHITE);
        lblPvJoueur1.setBounds(5, 30, 70, 20);
        this.add(lblPvJoueur1);
        lblPvJoueur1.setForeground(Color.red);
        btnRetour.setBounds(985, 550, 80, 20);
        btnRetour.setBackground(Color.white);
        this.add(btnRetour);
        btnRetour.addActionListener(action);
        btnAide.setBounds(942, 550, 41, 20);
        btnAide.setBackground(Color.white);
        this.add(btnAide);
        btnAide.addActionListener(action);
        pnlConteneur.add(explosion1);
        pnlConteneur.add(explosion2);
        pnlConteneur.add(explosion3);
        pnlConteneur.add(explosion4);
        pnlConteneur.add(explosion5);
        pnlConteneur.add(explosionSonore);
        lblPvJoueur2.setBounds(960, 30, 70, 20);
        this.add(lblPvJoueur2);
        lblPvJoueur2.setForeground(Color.blue);
        lblMunitions.setBounds(200, 30, 100, 20);
        lblMunitions.setForeground(Color.white);
        this.add(lblMunitions);

        cboArmes.addActionListener(action);
        btnDeplacement.addActionListener(action);
        sldVitesse.addChangeListener(sldL);
        sldAngle.addChangeListener(sldL);

        this.setSize(f.getSize());
        this.setVisible(true);

        KeyStroke space = KeyStroke.getKeyStroke(' ');

        InputMap inputMap = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(space, "Espace");
        ActionMap actionMap = this.getActionMap();
        actionMap.put("Espace", actionListener);
        this.setActionMap(actionMap);
        f.repaint();

        KeyAdapt keyAdapt = new KeyAdapt();
        btnDeplacement.addKeyListener(keyAdapt);
        cboArmes.addKeyListener(keyAdapt);
        sldVitesse.addKeyListener(keyAdapt);
        sldAngle.addKeyListener(keyAdapt);
        debutJeu = false;
    }
    /**
     * Classe de gestion des clics du bouton espace pour le NJumper,
     * le boomerang et la bombe fertile
     */
    Action actionListener = new AbstractAction() {

        public void actionPerformed(ActionEvent actionEvent) {
            try {
                if (projectile.getClass().equals(NJumper.class)
                        && projectile.getThread().isAlive()) {
                    if (Jeu.getTourTir() % 2 == 0) {
                        getProjectile().setVitesseX(sldVitesse.getValue() / 7,
                                sldAngle.getValue());
                        getProjectile().setVitesseY(sldVitesse.getValue() / 7,
                                sldAngle.getValue());
                    } else if (Jeu.getTourTir() % 2 == 1) {
                        getProjectile().setVitesseX(sldVitesse.getValue() / 7,
                                180 - sldAngle.getValue());
                        getProjectile().setVitesseY(sldVitesse.getValue() / 7,
                                180 - sldAngle.getValue());
                    }
                } else if (projectile.getClass().equals(BombeFertile.class)
                        && projectile.getThread().isAlive()) {
                    bf = (BombeFertile) projectile;
                    bf.division();

                } else if (projectile.getClass().equals(Boomerang.class)
                        && projectile.getThread().isAlive()) {
                    if (Jeu.getTourTir() % 2 == 0) {
                        getProjectile().setVitesseX(sldVitesse.getValue() / 7,
                                180 - sldAngle.getValue());
                        getProjectile().setVitesseY(sldVitesse.getValue() / 7,
                                180 - sldAngle.getValue());
                    } else if (Jeu.getTourTir() % 2 == 1) {
                        getProjectile().setVitesseX(sldVitesse.getValue() / 7,
                                sldAngle.getValue());
                        getProjectile().setVitesseY(sldVitesse.getValue() / 7,
                                sldAngle.getValue());
                    }
                }
            } catch (NullPointerException e) {
                System.out.println("NULL POINTER WTF");
            }
        }
    };

    /**
     * Classe de gestion des fleches pour la teleportation
     */
    class KeyAdapt extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent ke) {
            if (ke.getKeyCode() == KeyEvent.VK_LEFT && cboArmes.getSelectedIndex() == 8 && teleportations <= 50) {
                if (Jeu.getTourTir() % 2 == 1 && getPersonnage1().getPosX() > 1) {
                    getPersonnage1().setPosition2(-2);
                } else if (Jeu.getTourTir() % 2 == 0 && getPersonnage1().getPosX() > 2) {
                    getPersonnage2().setPosition2(-2);
                }
                teleportations++;
                f.repaint();
            } else if (ke.getKeyCode() == KeyEvent.VK_RIGHT && cboArmes.getSelectedIndex() == 8 && teleportations <= 50) {
                if (Jeu.getTourTir() % 2 == 1 && getPersonnage1().getPosX() < f.getWidth() - 5) {
                    getPersonnage1().setPosition2(2);
                } else if (Jeu.getTourTir() % 2 == 0 && getPersonnage2().getPosX() < f.getWidth() - 10) {
                    getPersonnage2().setPosition2(2);
                }
                teleportations++;
                f.repaint();
            }
        }
    }

    /**
     * Définit l'etiquette du vent
     * @param vent vent à assigner
     */
    public void setLblVent(double vent) {
        lblVent.setText("Vent : " + vent);
    }

    /**
     * Définit l'etiquette de la gravité
     * @param gravite
     */
    public void setLblGravite(double gravite) {
        lblGravite.setText("Gravite : " + gravite);
    }

    /**
     * Retourne le panneau de jeu
     * @return retourne le panneau de jeu
     */
    private PnlJeu getPnlJeu() {
        return this;
    }

    /**
     * Retourne le slider de l'angle
     * @return retourne le slider de l'angle
     */
    public JSlider getSldAngle() {
        return sldAngle;
    }

    /**
     * Retourne le slider de vitesse
     * @return Retourne le slider de vitesse
     */
    public JSlider getSldVitesse() {
        return sldVitesse;
    }

    /**
     * Retourne la fenetre du jeu
     * @return Retourne la fenetre du jeu
     */
    public Fenetre getF() {
        return f;
    }

    /**
     * Retourne la liste deroulante des armes
     * @return Retourne la liste deroulante des armes
     */
    public JComboBox getCboArmes() {
        return cboArmes;
    }

    /**
     * Retourne le projectile en cours
     * @return Retourne le projectile en cours
     */
    public ProjectileSimple getProjectile() {
        return projectile;
    }

    /**
     * Retourne la bombe fertile s'il y a lieu
     * @return Retourne la bombe fertile s'il y a lieu
     */
    public BombeFertile getBF() {
        return (BombeFertile) projectile;
    }

    /**
     * Retourne la permiere sous-bombe s'il y a lieu
     * @return Retourne la permiere sous-bombe s'il y a lieu
     */
    public SousBombe getSB1() {
        return bf.getSb1();
    }

    /**
     * Retourne la deuxieme sous-bombe s'il y a lieu
     * @return Retourne la deuxieme sous-bombe s'il y a lieu
     */
    public SousBombe getSB2() {
        return bf.getSb2();
    }

    /**
     * Retourne la troisieme sous-bombe s'il y a lieu
     * @return Retourne la troisieme sous-bombe s'il y a lieu
     */
    public SousBombe getSB3() {
        return bf.getSb3();
    }

    /**
     * Retourne la quatrieme sous-bombe s'il y a lieu
     * @return Retourne la quatrieme sous-bombe s'il y a lieu
     */
    public SousBombe getSB4() {
        return bf.getSb4();
    }

    /**
     * Retourne la cinquieme sous-bombe s'il y a lieu
     * @return Retourne la cinquieme sous-bombe s'il y a lieu
     */
    public SousBombe getSB5() {
        return bf.getSb5();
    }

    /**
     * Retourne la visee
     * @return retourne la visee
     */
    public Visee getVisee() {
        return visee;
    }

    /**
     * Retourne la visee du laser
     * @return retourne la visee du laser
     */
    public Visee getViseeLaser() {
        return viseeLaser;
    }

    /**
     * Retourne le decor
     * @return retourne le decor
     */
    public Decor getMonDecor() {
        return monDecor;
    }

/**
 * Retourne si la barre de volume est en jeu ou non
 * @return Retourne si la barre de volume est en jeu ou non
 */
    public boolean isBarreVolume() {
        return barreVolume;
    }
    /**
     * Touche le personnage 1
     * @param dommages dommages a infliger
     * @param points points a donner a l'autre joueur
     * @param force force du joueur qui frappe
     */
    public void personnage1Touche(int dommages, int points, double force) {
        perso1.EstTouche((int) (dommages * force));
        lblPvJoueur1.setText("PV : " + perso1.getPv());
        perso2.Atouche(points);
        lblJoueur2.setText("Joueur 2 : " + perso2.getPoints());
    }

    /**
     * Touche le personnage 2
     * @param dommages dommages a infliger
     * @param points points a donner a l'autre joueur
     * @param force force du joueur qui frappe
     */
    public void personnage2Touche(int dommages, int points, double force) {
        perso2.EstTouche((int) (dommages * force));
        lblPvJoueur2.setText("PV : " + perso2.getPv());
        perso1.Atouche(points);
        lblJoueur1.setText("Joueur 1 : " + perso1.getPoints());
    }

    /**
     * Crée un nouveau projectile dépendamment de la liste déroulante
     */
    public void nouveauProjectile() {

        if (Jeu.getTourTir() % 2 == 1) {
            positionDepartX = perso1.getPosX() + 8;
            positionDepartY = perso1.getPosY();
            lblMunitions.setBounds(200, 30, 100, 20);
        } else if (Jeu.getTourTir() % 2 == 0) {
            positionDepartX = perso2.getPosX() - 30;
            positionDepartY = perso2.getPosY();
            lblMunitions.setBounds(750, 30, 100, 20);
        }
        barreVolume = false;
        sldAngle.setMinimum(0);
        sldAngle.setMaximum(180);
        sldAngle.setValue(0);
        laser = new Laser(-500, -500, this);
        if (!debutJeu) {
            munitions = f.getJeu().getQuantite(cboArmes.getSelectedIndex() + 1, Jeu.getTourTir() % 2);
        }
        lblMunitions.setText("Munitions: " + munitions);

        switch (cboArmes.getSelectedIndex()) {
            case 0:
                if (!debutJeu) {
                    if (f.getJeu().getQuantite(1, Jeu.getTourTir() % 2) == 0) {
                        btnDeplacement.setEnabled(false);
                        sldVitesse.setEnabled(false);
                        sldAngle.setEnabled(false);
                    } else {
                        btnDeplacement.setEnabled(true);
                        sldVitesse.setEnabled(true);
                        sldAngle.setEnabled(true);
                    }
                }
                lblMunitions.setText("Munitions: inf.");
                projectile = new ProjectileSimple(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 1:
                if (f.getJeu().getQuantite(2, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new NJumper(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 2:
                if (f.getJeu().getQuantite(3, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new BombeSonore(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 3:
                if (f.getJeu().getQuantite(4, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new BombeFertile(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 4:
                if (f.getJeu().getQuantite(5, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new Boomerang(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 5:
                if (f.getJeu().getQuantite(6, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new BombeTornade(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 6:
                if (f.getJeu().getQuantite(7, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                projectile = new BombeGravite(positionDepartX, positionDepartY, this);
                pnlConteneur.add(projectile);
                break;
            case 7:
                if (f.getJeu().getQuantite(8, Jeu.getTourTir() % 2) == 0) {
                    btnDeplacement.setEnabled(false);
                    sldAngle.setEnabled(false);
                } else {
                    btnDeplacement.setEnabled(true);
                    sldAngle.setEnabled(true);
                }
                sldAngle.setMinimum(-90);
                sldAngle.setMaximum(90);
                sldAngle.setValue(0);
                laser = new Laser(positionDepartX, positionDepartY, this);
                pnlConteneur.add(laser);
                projectile = new ProjectileSimple(-500, -500, this);
                sldVitesse.setEnabled(false);
                break;
            case 8:
                projectile = new ProjectileSimple(-500, -500, this);
                break;
            case 9:
                if (Jeu.getTourTir() % 2 == 0) {
                    if (perso2.getEtat() == 1) {
                        btnDeplacement.setEnabled(false);
                    } else {
                        btnDeplacement.setEnabled(true);
                    }
                } else {
                    if (perso1.getEtat() == 1) {
                        btnDeplacement.setEnabled(false);
                    } else {
                        btnDeplacement.setEnabled(true);
                    }
                }
                sldVitesse.setEnabled(false);
                sldAngle.setEnabled(false);
                projectile = new ProjectileSimple(-500, -500, this);
                break;
        }
        f.repaint();
    }

    /**
     * Retourne l'explosion selon l'index
     * @param index numero de l'explosion
     * @return retourne l'explosion correspondante
     */
    public Explosion getExplosion(int index) {
        Explosion retour = null;
        switch (index) {
            case 1:
                retour = explosion1;
                break;
            case 2:
                retour = explosion2;
                break;
            case 3:
                retour = explosion3;
                break;
            case 4:
                retour = explosion4;
                break;
            case 5:
                retour = explosion5;
                break;
        }
        if (projectile instanceof BombeSonore) {
            retour = explosionSonore;
        }
        return retour;
    }

    /**
     * Retourne le panneau conteneur
     * @return retourne le panneau conteneur
     */
    public JPanel getPnlConteneur() {
        return pnlConteneur;
    }

    /**
     * Retourne le bouton de déplacement
     * @return retourne le bouton de déplacement
     */
    public JButton getBtnDeplacement() {
        return btnDeplacement;
    }

    /**
     * Retourne le personnage 2
     * @return retourne le personnage 2
     */
    public Personnage getPersonnage2() {
        return perso2;
    }

    /**
     * Retourne le personnage 1
     * @return retourne le personnage 1
     */
    public Personnage getPersonnage1() {
        return perso1;
    }

    /**
     * Définit si l'arc en ciel doit etre dessiné ou non
     * @param dessiner valeur de dessin
     */
    public void setArcEnCiel(boolean dessiner) {
        this.dessinerArcEnCiel = dessiner;
    }

    /**
     * Définit si la barre de volume est en fonction
     * @param barreV valeur de définition
     */
    public void setBarreVolume(boolean barreV) {
        barreVolume = barreV;
    }

    /**
     * Méthode de dessin du volume
     * @param volume valeur du volume
     */
    public void dessinerVolume(int volume, int cri) {
        this.volume = volume;
        if (Jeu.getTourTir() % 2 + cri == 0) {         
            this.repaint(30, 70, 20, 80);
        } else {                                
            this.repaint(1020, 70, 20, 80);
        }                                      
    }

    /**
     * Remet le jeu à zéro
     */
    public void mettreAZero() {
        monDecor = new Decor(f);
        getPersonnage1().setPosition(62, monDecor.getTerrainY(31) + 32);
        getPersonnage1().setForce(1);
        getPersonnage1().setEtat(0);
        getPersonnage1().setPv(1000);
        getPersonnage1().setPoints(0);
        lblPvJoueur1.setText("PV : " + perso1.getPv());
        lblJoueur1.setText("Joueur 1 : " + perso1.getPoints());
        getPersonnage2().setPosition(997, monDecor.getTerrainY(498) + 32);
        getPersonnage2().setForce(1);
        getPersonnage2().setEtat(0);
        getPersonnage2().setPv(1000);
        getPersonnage2().setPoints(0);
        lblPvJoueur2.setText("PV : " + perso1.getPv());
        lblJoueur2.setText("Joueur 2 : " + perso1.getPoints());
        f.getJeu().setQuantites(500, 5, 3, 3, 5, 1, 1, 6, 500, 5, 3, 3, 5, 1, 1, 6);
        nouveauProjectile();
        f.repaint();
    }

    @Override
    public void paintComponent(Graphics g) {//Dessine le panneau
        g.setColor(Color.black);
        g.fillRect(0, 0, getWidth(), getHeight());
        if (dessinerArcEnCiel == true) {
            g.setColor(Color.red);
            g.fillOval(100, 100, 850, 850);
            g.setColor(Color.orange);
            g.fillOval(110, 110, 830, 830);
            g.setColor(Color.yellow);
            g.fillOval(120, 120, 810, 810);
            g.setColor(Color.green);
            g.fillOval(130, 130, 790, 790);
            g.setColor(Color.blue);
            g.fillOval(140, 140, 770, 770);
            g.setColor(new Color(100, 0, 255));
            g.fillOval(150, 150, 750, 750);
            g.setColor(Color.black);
            g.fillOval(160, 160, 730, 730);
        }
        explosionSonore.paintComponent(g);
        perso1.paintComponent(g);
        perso2.paintComponent(g);

        projectile.paintComponent(g);
        monDecor.paintComponent(g);
        visee.paintComponent(g);
        viseeLaser.paintComponent(g);
        laser.paintComponent(g);
        explosion1.paintComponent(g);
        explosion2.paintComponent(g);
        explosion3.paintComponent(g);
        explosion4.paintComponent(g);
        explosion5.paintComponent(g);
        g.setColor(Color.DARK_GRAY);
        g.fillRoundRect(73, 32, 104, 18, 3, 3);
        g.fillRoundRect(848, 32, 104, 18, 3, 3);
        g.setColor(Color.red);
        g.fillRoundRect(75, 34, getPersonnage1().getPv() / 10, 14, 3, 3);
        g.setColor(Color.blue);
        g.fillRoundRect(850 + (100 - getPersonnage2().getPv() / 10), 34, 100 - (100 - getPersonnage2().getPv() / 10), 14, 3, 3);
        g.setColor(Color.DARK_GRAY);
        g.fillRect(28, 68, 24, 84);
        g.fillRect(1018, 68, 24, 84);
        g.setColor(Color.black);
        g.fillRect(30, 70, 20, 80);
        g.fillRect(1020, 70, 20, 80);
       if (barreVolume) {             
            if (volume > 0) {
                if (volume > 60) {
                    g.setColor(new Color(255, 0, 0));
                } else {
                    g.setColor(new Color(volume * 4, 255 - volume * 4, 0));
                }
            } else {
                g.setColor(new Color(0, 180, 40));
            }
            if (Jeu.getTourTir() % 2 == 0) {
                g.fillRect(30, 70, 20, 80);
                g.setColor(Color.black);
                g.fillRect(30, 70, 20, 70 - volume);
            } else {                            
                g.fillRect(1020, 70, 20, 80);
                g.setColor(Color.black);
                g.fillRect(1020, 70, 20, 70 - volume);
            }                                    
        }
    }

    /**
     * Classe de gestion de bouton deplacement
     */
    class Actions implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnDeplacement) {
                if (Jeu.getTourTir() % 2 == 1) {
                    if (cboArmes.getSelectedIndex() != 7) {
                        f.getJeu().deplacement(sldVitesse.getValue() / 4, sldAngle.getValue());
                    } else {
                        laser.deplacement(sldAngle.getValue());
                    }
                } else if (Jeu.getTourTir() % 2 == 0) {
                    if (cboArmes.getSelectedIndex() != 7) {
                        f.getJeu().deplacement(sldVitesse.getValue() / 4, 180 - sldAngle.getValue());
                    } else {
                        laser.deplacement(180 - sldAngle.getValue());
                    }
                }

                f.getJeu().setQuantite(cboArmes.getSelectedIndex() + 1,
                        Jeu.getTourTir() % 2,
                        f.getJeu().getQuantite(cboArmes.getSelectedIndex() + 1,
                        Jeu.getTourTir() % 2) - 1);
                if (cboArmes.getSelectedIndex() == 9) {
                    criDeGuerre.crier();
                    cboArmes.setEnabled(true);
                    btnDeplacement.setEnabled(false);
                    sldVitesse.setEnabled(true);
                    sldAngle.setEnabled(true);
                } else {
                    Jeu.ajouterTour();
                }

                teleportations = 0;

            }
            if (e.getSource() == cboArmes) {
                nouveauProjectile();
            }
            if (e.getSource() == btnRetour) {
                switch (JOptionPane.showConfirmDialog(null, "Êtes-vous sûr ?")) {
                    case 0:
                        f.afficherMenuPrincipal();
                        mettreAZero();
                        break;
                    default:
                        ;
                }
            }
            if (e.getSource() == btnAide) {
                f.afficherReglesJeu();
                f.getPnlReglesJeu().setPrecedent(1);
            }
        }
    }

    /**
     * Classe de gestion des evenements sur les sliders
     */
    class SliderListener implements ChangeListener {

        public void stateChanged(ChangeEvent ce) {
            if (ce.getSource().getClass() == JSlider.class) {
                f.repaint();
            }
        }
    }
}
